package com.itheima.mybatis.mapper;

import com.itheima.mybatis.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 操作数据库的品牌接口
 * CRUD
 * mapper方法名，类似SQL单词
 * 与品牌有关的都在一个接口里面
 * 品牌相关的都在品牌里面
 */
public interface BrandMapper {
    /**
     * 1. 查询所有品牌
     * 接口方法，是不是要对应一个SQL语句？
     */
    List<Brand> selectAll();

    // 学会自己设计方法
    // mybatis开发，设计接口，在SQL映射文件中编写对应的SQL语句
    /**
     * 根据ID，获取某一品牌
     * 设计方法：
     * 1.方法名有意义，动词+名称
     * 2.传入参数
     * 3.返回参数
     */
    @Select("select *\n" +
            "        from tb_brand\n" +
            "        where id = ${brandId}")
    @ResultMap("brandMap")
    Brand selectById(Integer brandId);

    /**
     * 多个参数,大于1个，必须加@param
     * @param brandName
     * @param companyName
     * @return
     */
    List<Brand> selectByWhere(@Param("status") Integer  status,
                              @Param("brandName") String brandName,
                              @Param("companyName") String companyName);

    /**
     * 多个参数,大于1个，必须加@param
     * 测试多个条件，选一个的情况
     * @param brandName
     * @param companyName
     * @return
     */
    List<Brand> selectByChoose(@Param("status") Integer  status,
                              @Param("brandName") String brandName,
                              @Param("companyName") String companyName);


    /**
     * 多个参数,大于1个，这个时候，并没有封装为某一个对象，这个时候可以用HashMap来封装
     * Map特点 key:value
     * 测试多个条件，选一个的情况
     * @return
     */
    List<Brand> selectByMap(Map hashMap);


    /**
     * mybatis:写接口方法，写对应的SQL
     * 添加品牌 (DML（数据操作语言）返回值，更新数据
     * 品牌信息很多，此时我们是Brand对象做参数
     * 方法设计：
     * 1. 方法名:insertXxx
     * 2. 入参：Brand brand
     * 3. 返回值：(DML（数据操作语言）返回的影响行数
     */
    /** JavaAPI文档
     * 添加品牌
     * @param brand 品牌的数据
     * @return 影响行数
     */
    Integer insertBrand(Brand brand);

    // 修改品牌
    // mybatis做两件事情:  写接口方法，写对应的SQL语句
    // 方法设计三要素：方法名、入参、返回值
    /**
     * 更新品牌
     * @param brand 品牌的数据
     * @return 影响的行数
     */
    Integer updateBrand(Brand brand);

    /**
     * 基于Id 删除
     * @param id 品牌Id
     * @return
     */
    Integer deleteById(Integer id);

    // 批量删除数据
    // mybatis做两件事情:  写接口方法，写对应的SQL语句
    // 方法设计三要素：方法名、入参(多个ID）、返回值
    Integer deleteByIds(@Param("ids") int[] ids);


}
